

//信息的类型 CODE_PING 心跳 、CODE_READY 链接就绪  CODE_MESSAGE 消息
export const CodeType = {
  CODE_PING: '0',
  CODE_READY: '1',
  CODE_MESSAGE: '2'
};

//信息的类型 MSG_USER 用户 MSG_SYSTEM 系统
export const ChatType = {
  MSG_USER: '0',
  MSG_SYSTEM: '1'
};

//直播消息的类型 LIVE_START 开始 、LIVE_USER 用户  LIVE_STOP 结束
export const LiveType = {
  LIVE_START: '0',
  LIVE_USER: '1',
  LIVE_STOP: '2'
};


/**
 * 错误常量
 * @type {{TIMEOUT_ERROR: number, PARAM_ERROR: number, SERVER_ERROR: number, NET_ERROR: string, TOKEN_ERROR: number, FLUSH_TOKEN_ERROR: number}}
 */
export const ErrorType = {
  TIMEOUT_ERROR: 9, //超时
  TOKEN_ERROR: 401, //token 失效错误
  PARAM_ERROR: 400, //参数错误
  FLUSH_TOKEN_ERROR: 7, //刷新token错误
  SERVER_ERROR: 500, //服务器错误
  NET_ERROR: 'TypeError: Failed to fetch' //网络链接不通
};

/**
 * 转义内容
 * @param content
 * @returns {*}
 */
export function transform(content) {
  // 支持的html标签
  let html = function(end) {
    return new RegExp('\\n*\\[' + (end || '') + '(code|pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)]\\n*', 'g');
  };
  let fa = faceUtils.faces();
  if (content) {
    content = content
      .replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/'/g, '&#39;')
      .replace(/"/g, '&quot;') // XSS
      .replace(/@(\S+)(\s+?|$)/g, '@<a href="javascript:;">$1</a>$2')

      .replace(/face\[([^\s\[\]]+?)]/g, function(face) {
        // 转义表情
        let alt = face.replace(/^face/g, '');
        return '<img alt="' + fa[alt] + '" title="' + fa[alt] + '" src="' + fa[alt] + '">';
      })
      .replace(/a\([\s\S]+?\)\[[\s\S]*?]/g, function(str) {
        // 转义链接
        let href = (str.match(/a\(([\s\S]+?)\)\[/) || [])[1];
        let text = (str.match(/\)\[([\s\S]*?)]/) || [])[1];
        if (!href) return str;
        return '<a href="' + href + '" target="_blank">' + (text || href) + '</a>';
      })
      .replace(html(), '<$1 $2>')
      .replace(html('/'), '</$1>') // 转移HTML代码
      .replace(/\n/g, '<br>'); // 转义换行
  }
  return content;
}

/**
 * 滚动条到最下方
 * @param id 容器id
 */
function scrollBottom(id) {
  let div = document.getElementById(id);
  if (div) {
    div.scrollTop = div.scrollHeight;
  }
}

/**
 * 表情工具
 * @type {{alt: string[], faces: (function(): {})}}
 */
export let faceUtils = {
  alt: [
    '[微笑]', '[嘻嘻]', '[哈哈]', '[可爱]', '[可怜]', '[挖鼻]', '[吃惊]', '[害羞]', '[挤眼]', '[闭嘴]', '[鄙视]', '[爱你]', '[泪]', '[偷笑]',
    '[亲亲]', '[生病]', '[太开心]', '[白眼]', '[右哼哼]', '[左哼哼]', '[嘘]', '[衰]', '[委屈]', '[吐]', '[哈欠]', '[抱抱]', '[怒]', '[疑问]',
    '[馋嘴]', '[拜拜]', '[思考]', '[汗]', '[困]', '[睡]','[钱]','[失望]','[酷]','[色]','[哼]','[鼓掌]','[晕]','[悲伤]','[抓狂]','[黑线]','[阴险]',
    '[怒骂]', '[互粉]', '[心]', '[伤心]', '[猪头]', '[熊猫]','[兔子]','[ok]','[耶]','[good]','[NO]','[赞]','[来]','[弱]','[草泥马]','[神马]',
    '[囧]', '[浮云]', '[给力]', '[围观]', '[威武]','[奥特曼]','[礼物]','[钟]','[话筒]','[蜡烛]', '[蛋糕]'
  ],
  faces: function() {
    let self = this;
    let arr = {};
    for (let i = 0; i < self.alt.length; i++) {
      arr[self.alt[i]] = '/static/face/' + i + '.gif';
    }
    return arr;
  }
}

/**
 * 图片加载完成处理函数
 * @param arr 图片的src集合
 * @returns {Promise}
 */
function preloadImages(arr) {
  let loadedImage = 0;
  let images = [];
  return new Promise(function(resolve, reject) {
    for (let i = 0; i < arr.length; i++) {
      images[i] = new Image();
      images[i].src = arr[i];
      images[i].onload = function() {
        loadedImage++;
        if (loadedImage === arr.length) {
          resolve();
        }
      };
      images[i].onerror = function() {
        reject();
      };
    }
  });
}

/**
 * 图片加载完成，聊天对话框scroll拉到最下
 * @param id 容器id
 */
export function imageLoad(id) {
  scrollBottom(id);
  let messageBox = document.getElementById(id);
  if (messageBox) {
    let images = messageBox.getElementsByTagName('img');
    if (images) {
      let arr = [];
      for (let i = 0; i < images.length; i++) {
        arr[i] = images[i].src;
      }
      preloadImages(arr)
        .then(() => {
          scrollBottom(id);
        })
        .catch(function() {
          scrollBottom(id);
        });
    }
  }
}

/**
 * 退出登录
 * @param self vue this对象
 */
export function logout(self) {
  self.$store.commit('closeConnect');
  self.$store.commit('clear');
  self.$store.commit('clearFlushTokenTimerId');
  // self.$router.push('/valid');
}
